package com.riekoff.particlecubeworld.player;

import java.util.ArrayList;
import java.util.List;

import com.riekoff.particlecubeworld.editor.visual.AVisual;

import cc.creativecomputing.CCApp;
import cc.creativecomputing.graphics.CCCamera;
import cc.creativecomputing.graphics.CCDrawMode;
import cc.creativecomputing.graphics.CCGraphics;
import cc.creativecomputing.graphics.CCVBOMesh;
import cc.creativecomputing.graphics.CCViewport;
import cc.creativecomputing.math.CCMath;
import cc.creativecomputing.math.CCVector3f;
import de.negativrekord.blockworld.MultiPathGenerator;
import de.negativrekord.blockworld.MultiPathGenerator.PathStyle;
import de.negativrekord.blockworld.MultiPathGenerator.StartPositions;

public class ABoxVisual2 implements AVisual{

	
	private CCCamera cam0;
	private CCCamera[] splitCams = new CCCamera[3];
	private CCVBOMesh _myMesh;
	
	private class CCBox{
		private CCVector3f _myDimension;
		private CCVector3f _myPosition;
		
		public CCBox(CCVector3f theDimension, CCVector3f thePosition){
			_myDimension = theDimension;
			_myPosition = thePosition;
			_myPosition.x = CCMath.floor(thePosition.x / 10) * 10;
			_myPosition.y = CCMath.floor(thePosition.y / 10) * 10;
			_myPosition.z = CCMath.floor(thePosition.z / 10) * 10;
		}
		
		public void draw(CCGraphics g){
			g.pushMatrix();
			final float x1 = _myPosition.x - _myDimension.x / 2f;
			final float x2 = _myPosition.x + _myDimension.x / 2f;
			final float y1 = _myPosition.y - _myDimension.y / 2f;
			final float y2 = _myPosition.y + _myDimension.y / 2f;
			final float z1 = _myPosition.z - _myDimension.z / 2f;
			final float z2 = _myPosition.z + _myDimension.z / 2f;

			g.beginShape(CCDrawMode.QUADS);

			float u1,v1,u2,v2;
			u1 = (_myPosition.x + x1) / 1000 + 1;
			v1 = (_myPosition.y + y1) / 1000 + 1;
			u2 = (_myPosition.x + x2) / 1000 + 1;
			v2 = (_myPosition.y + y2) / 1000 + 1;
			
			// front
			g.normal(0,0,-1);
			g.textureCoords(0, u1,v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 1, 2);
			g.vertex(x1, y2, z1);
			
			g.textureCoords(0, u2, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 1, 2);
			g.vertex(x2, y2, z1);
			
			g.textureCoords(0, u2, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 1, 2);
			g.vertex(x2, y1, z1);
			
			g.textureCoords(0, u1, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 1, 2);
			g.vertex(x1, y1, z1);
			
			u1 = (_myPosition.z + z1) / 1000 + 1;
			v1 = (_myPosition.y + y1) / 1000 + 1;
			u2 = (_myPosition.z + z2) / 1000 + 1;
			v2 = (_myPosition.y + y2) / 1000 + 1;

			// right
			g.normal(1,0,0);
			g.textureCoords(0, u1, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x2, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 2, 1, 0);
			g.vertex(x2, y2, z1);
			
			g.textureCoords(0, u2, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x2, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 2, 1, 0);
			g.vertex(x2, y2, z2);
			
			g.textureCoords(0, u2, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x2, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 2, 1, 0);
			g.vertex(x2, y1, z2);
			
			g.textureCoords(0, u1, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x2, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 2, 1, 0);
			g.vertex(x2, y1, z1);
			
			u1 = (_myPosition.x + x1) / 1000 + 1;
			v1 = (_myPosition.y + y1) / 1000 + 1;
			u2 = (_myPosition.x + x2) / 1000 + 1;
			v2 = (_myPosition.y + y2) / 1000 + 1;

			// back
			g.normal(0,0,1);
			g.textureCoords(0, u2, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z2);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 1, 2);
			g.vertex(x2, y2, z2);
			
			g.textureCoords(0, u1, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z2);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 1, 2);
			g.vertex(x1, y2, z2);
			
			g.textureCoords(0, u1, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z2);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 1, 2);
			g.vertex(x1, y1, z2);
			
			g.textureCoords(0, u2, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z2);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 1, 2);
			g.vertex(x2, y1, z2);
			
			u1 = (_myPosition.z + z1) / 1000 + 1;
			v1 = (_myPosition.y + y1) / 1000 + 1;
			u2 = (_myPosition.z + z2) / 1000 + 1;
			v2 = (_myPosition.y + y2) / 1000 + 1;

			// left
			g.normal(-1,0,0);
			g.textureCoords(0, u2, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 2, 1, 0);
			g.vertex(x1, y2, z2);
			
			g.textureCoords(0, u1, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 2, 1, 0);
			g.vertex(x1, y2, z1);
			
			g.textureCoords(0, u1, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 2, 1, 0);
			g.vertex(x1, y1, z1);
			
			g.textureCoords(0, u2, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 2, 1, 0);
			g.vertex(x1, y1, z2);
			
			u1 = (_myPosition.x + x1) / 1000 + 1;
			v1 = (_myPosition.z + z1) / 1000 + 1;
			u2 = (_myPosition.x + x2) / 1000 + 1;
			v2 = (_myPosition.z + z2) / 1000 + 1;

			// top
			g.normal(0,-1,0);
			g.textureCoords(0, u1, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 2, 1);
			g.vertex(x1, y1, z1);
			
			g.textureCoords(0, u2, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 2, 1);
			g.vertex(x2, y1, z1);
			
			g.textureCoords(0, u2, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 2, 1);
			g.vertex(x2, y1, z2);
			
			g.textureCoords(0, u1, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y1, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 2, 1);
			g.vertex(x1, y1, z2);
			
			u1 = (_myPosition.x + x1) / 1000 + 1;
			v1 = (_myPosition.z + z1) / 1000 + 1;
			u2 = (_myPosition.x + x2) / 1000 + 1;
			v2 = (_myPosition.z + z2) / 1000 + 1;

			// bottom
			g.normal(0,1,0);
			g.textureCoords(0, u1, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y2, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 2, 1);
			g.vertex(x1, y2, z2);
			
			g.textureCoords(0, u2, v2);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y2, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 2, 1);
			g.vertex(x2, y2, z2);
			
			g.textureCoords(0, u2, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y2, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 2, 1);
			g.vertex(x2, y2, z1);
			
			g.textureCoords(0, u1, v1);
			g.textureCoords(1, u1,v1, u2, v2);
			g.textureCoords(2, x1, y2, z1);
			g.textureCoords(3, x2, y2, z2);
			g.textureCoords(4, 0, 2, 1);
			g.vertex(x1, y2, z1);

			g.endShape();
			g.popMatrix();
		}
		
		public void addToMesh (CCVBOMesh theMesh) {
				
			final float x1 = _myPosition.x - _myDimension.x / 2f;
			final float x2 = _myPosition.x + _myDimension.x / 2f;
			final float y1 = _myPosition.y - _myDimension.y / 2f;
			final float y2 = _myPosition.y + _myDimension.y / 2f;
			final float z1 = _myPosition.z - _myDimension.z / 2f;
			final float z2 = _myPosition.z + _myDimension.z / 2f;

		
			float u1,v1,u2,v2;
			u1 = (_myPosition.x + x1) / 1000 + 1;
			v1 = (_myPosition.y + y1) / 1000 + 1;
			u2 = (_myPosition.x + x2) / 1000 + 1;
			v2 = (_myPosition.y + y2) / 1000 + 1;
			
			// front
			//g.normal(0,0,-1);
			
			theMesh.addTextureCoords(0, u1,v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 1, 2);
			theMesh.addVertex(x1, y2, z1);
			
			theMesh.addTextureCoords(0, u2, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 1, 2);
			theMesh.addVertex(x2, y2, z1);
			
			theMesh.addTextureCoords(0, u2, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 1, 2);
			theMesh.addVertex(x2, y1, z1);
			
			theMesh.addTextureCoords(0, u1, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 1, 2);
			theMesh.addVertex(x1, y1, z1);
			
			u1 = (_myPosition.z + z1) / 1000 + 1;
			v1 = (_myPosition.y + y1) / 1000 + 1;
			u2 = (_myPosition.z + z2) / 1000 + 1;
			v2 = (_myPosition.y + y2) / 1000 + 1;

			// right
			theMesh.addTextureCoords(0, u1, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x2, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 2, 1, 0);
			theMesh.addVertex(x2, y2, z1);
			
			theMesh.addTextureCoords(0, u2, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x2, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 2, 1, 0);
			theMesh.addVertex(x2, y2, z2);
			
			theMesh.addTextureCoords(0, u2, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x2, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 2, 1, 0);
			theMesh.addVertex(x2, y1, z2);
			
			theMesh.addTextureCoords(0, u1, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x2, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 2, 1, 0);
			theMesh.addVertex(x2, y1, z1);
			
			u1 = (_myPosition.x + x1) / 1000 + 1;
			v1 = (_myPosition.y + y1) / 1000 + 1;
			u2 = (_myPosition.x + x2) / 1000 + 1;
			v2 = (_myPosition.y + y2) / 1000 + 1;

			// back
			theMesh.addTextureCoords(0, u2, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z2);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 1, 2);
			theMesh.addVertex(x2, y2, z2);
			
			theMesh.addTextureCoords(0, u1, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z2);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 1, 2);
			theMesh.addVertex(x1, y2, z2);
			
			theMesh.addTextureCoords(0, u1, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z2);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 1, 2);
			theMesh.addVertex(x1, y1, z2);
			
			theMesh.addTextureCoords(0, u2, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z2);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 1, 2);
			theMesh.addVertex(x2, y1, z2);
			
			u1 = (_myPosition.z + z1) / 1000 + 1;
			v1 = (_myPosition.y + y1) / 1000 + 1;
			u2 = (_myPosition.z + z2) / 1000 + 1;
			v2 = (_myPosition.y + y2) / 1000 + 1;

			// left
			theMesh.addTextureCoords(0, u2, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 2, 1, 0);
			theMesh.addVertex(x1, y2, z2);
			
			theMesh.addTextureCoords(0, u1, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 2, 1, 0);
			theMesh.addVertex(x1, y2, z1);
			
			theMesh.addTextureCoords(0, u1, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 2, 1, 0);
			theMesh.addVertex(x1, y1, z1);
			
			theMesh.addTextureCoords(0, u2, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 2, 1, 0);
			theMesh.addVertex(x1, y1, z2);
			
			u1 = (_myPosition.x + x1) / 1000 + 1;
			v1 = (_myPosition.z + z1) / 1000 + 1;
			u2 = (_myPosition.x + x2) / 1000 + 1;
			v2 = (_myPosition.z + z2) / 1000 + 1;

			// top
			theMesh.addTextureCoords(0, u1, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 2, 1);
			theMesh.addVertex(x1, y1, z1);
			
			theMesh.addTextureCoords(0, u2, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 2, 1);
			theMesh.addVertex(x2, y1, z1);
			
			theMesh.addTextureCoords(0, u2, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 2, 1);
			theMesh.addVertex(x2, y1, z2);
			
			theMesh.addTextureCoords(0, u1, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y1, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 2, 1);
			theMesh.addVertex(x1, y1, z2);
			
			u1 = (_myPosition.x + x1) / 1000 + 1;
			v1 = (_myPosition.z + z1) / 1000 + 1;
			u2 = (_myPosition.x + x2) / 1000 + 1;
			v2 = (_myPosition.z + z2) / 1000 + 1;

			// bottom
			theMesh.addTextureCoords(0, u1, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y2, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 2, 1);
			theMesh.addVertex(x1, y2, z2);
			
			theMesh.addTextureCoords(0, u2, v2);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y2, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 2, 1);
			theMesh.addVertex(x2, y2, z2);
			
			theMesh.addTextureCoords(0, u2, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y2, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 2, 1);
			theMesh.addVertex(x2, y2, z1);
			
			theMesh.addTextureCoords(0, u1, v1);
			theMesh.addTextureCoords(1, u1,v1, u2, v2);
			theMesh.addTextureCoords(2, x1, y2, z1);
			theMesh.addTextureCoords(3, x2, y2, z2);
			theMesh.addTextureCoords(4, 0, 2, 1);
			theMesh.addVertex(x1, y2, z1);

		}
	}
	
	private List<CCBox> _myBoxes = new ArrayList<>();
	
	public ABoxVisual2(CCApp theApp){
		
		_myMesh = new CCVBOMesh(CCDrawMode.QUADS,100000);
		
		// cam paths
		_myPathGenerator.addPath(PathStyle.CIRCLE, 1500, 0, 1);
		_myPathGenerator.addPath(PathStyle.PLANE, 1000, 1, 2f, new CCVector3f(0,1000,500));
		_myPathGenerator.addPath(PathStyle.FREE, 400, 2, 0.1f);
		_myPathGenerator.addPath(PathStyle.CUBE, 800, 3, 1f);
		
		// class center paths
		_myPathGenerator.addPath(PathStyle.FREE, 100, 4, 1);
		_myPathGenerator.addPath(PathStyle.FREE, 100, 5, 1);
		_myPathGenerator.addPath(PathStyle.FREE, 100, 6, 1);
		_myPathGenerator.addPath(PathStyle.FREE, 100, 7, 1);
		
		cam0 = new CCCamera(theApp.g);
		cam0.viewport(new CCViewport (0,0,theApp.width,theApp.height));
		
		splitCams[0] = new CCCamera(theApp.g);
		splitCams[0].viewport(new CCViewport (0,theApp.height/3,theApp.width/3,theApp.height/3));
		splitCams[1] = new CCCamera(theApp.g);
		splitCams[1].viewport(new CCViewport (theApp.width/3,theApp.height/3,theApp.width/3,theApp.height/3));
		splitCams[1].fov(70);
		splitCams[2] = new CCCamera(theApp.g);
		splitCams[2].viewport(new CCViewport (theApp.width*2/3,theApp.height/3,theApp.width/3,theApp.height/3));
	
		
		int size0 = 1000;
		_myBoxes.add(new CCBox (new CCVector3f(size0, size0, size0), new CCVector3f(0,0,0)));
		
		addBoxDetail(size0, 200, 0, 200);
//		addBoxDetail(size0, 50, 0, 500);
		
		for (CCBox b: _myBoxes) {
			b.addToMesh(_myMesh);
		}

	}
	
	public CCVector3f center(int n) {
		return _myPathGenerator.spline(n);
	}
	
	void addBoxDetail(int size0, int size1, int minH, int maxH) {

		for (int i=0; i<size0/size1; i++) {
			for (int j=0; j<size0/size1; j++) {
				_myBoxes.add(new CCBox (new CCVector3f(CCMath.random(minH,maxH), size1, size1), new CCVector3f(size0/2,i*size1-size0/2,j*size1-size0/2)));
				_myBoxes.add(new CCBox (new CCVector3f(CCMath.random(minH,maxH), size1, size1), new CCVector3f(-size0/2,i*size1-size0/2,j*size1-size0/2)));
			}	
		}
		
		for (int i=0; i<size0/size1; i++) {
			for (int j=0; j<size0/size1; j++) {
				_myBoxes.add(new CCBox (new CCVector3f(size1, CCMath.random(minH,maxH), size1), new CCVector3f(-size0/2+i*size1,-size0/2, -size0/2+j*size1)));
				_myBoxes.add(new CCBox (new CCVector3f(size1, CCMath.random(minH,maxH), size1), new CCVector3f(-size0/2+i*size1, size0/2, -size0/2+j*size1)));
			}	
		}
		
		for (int i=0; i<size0/size1; i++) {
			for (int j=0; j<size0/size1; j++) {
				_myBoxes.add(new CCBox (new CCVector3f(size1, size1, CCMath.random(minH,maxH)), new CCVector3f(-size0/2+i*size1,-size0/2+j*size1,-size0/2)));
				_myBoxes.add(new CCBox (new CCVector3f(size1, size1, CCMath.random(minH,maxH)), new CCVector3f(-size0/2+i*size1,-size0/2+j*size1,size0/2)));
			}	
		}
		
//		for (int i=0; i<100; i++) {
//			int size = (int)CCMath.random(10,40);
//			_myBoxes.add(new CCBox (new CCVector3f(size,size,size), new CCVector3f(CCMath.random(-200,200),CCMath.random(-200,200),CCMath.random(-200,200))));
//		}
		
	}
	
	private MultiPathGenerator _myPathGenerator = new MultiPathGenerator (10, StartPositions.GRID, 0,0,0,0);
	private int cam = 0;
	
	public void cam (int theCam) {
		cam = theCam;
	}
	@Override
	public void draw(CCGraphics g) {
		

		_myPathGenerator.update(0.001f);
		
		if (cam==0) {
			cam0.draw(g);
			cam0.target(_myPathGenerator.splineDir(3));		
			for (CCBox b: _myBoxes) {
				b.draw(g);
			}
		}
		else {
			int i = 1;
			splitCams[0].target(new CCVector3f(1000,0,100));
			splitCams[1].target(_myPathGenerator.splineDir(2));
			splitCams[2].target(_myPathGenerator.splineDir(3));
			for (CCCamera c: splitCams) {
				c.position(_myPathGenerator.spline(i));
				i+=1;
				c.draw(g);
				for (CCBox b: _myBoxes) {
					b.draw(g);
				}
			}
		}
	}
}
